package com.tdam2013.grupo07.data;

import java.util.Calendar;
import java.util.Date;

import com.tdam2013.grupo07.util.Constantes;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

public class DatabaseHelper extends SQLiteOpenHelper {

	public static final int VERSION_BD = 1;

	public final static int CONECTIVITY_TYPE_WIFI = 0;
	public final static int CONECTIVITY_TYPE_NETWORK = 1;
	public static final int CONECTIVITY_TYPE_DISCONNECT = 2;
	public final static int CONECTIVITY_STATE_DISCONECTED = 0;
	public final static int CONECTIVITY_STATE_CONECTED = 1;

	public static final String nombreBD = "Mensajeria7App.db";
	public static final String contacto7AppTabla = "Contacto7App";
	public static final String colContacto7appID = "contacto7appID";
	public static final String colUsuario = "usuario";

	public static final String mensajeTabla = "Mensaje";
	public static final String colMensajeID = "mensajeID";
	public static final String colContactoExterno = "contactoExterno";
	public static final String colContactoUsuario = "contactoUsuario";
	public static final String colTipoMensaje = "tipoMensaje";
	public static final String colFecha = "fecha";
	public static final String colContenido = "contenido";

	public static final String conectividadTabla = "Conectividad";
	public static final String colConectividadID = "conectividadID";
	// Se refiere a si es Wi-fi o Network
	public static final String colConectividadTipo = "conectividadTipo";
	// Se refiere a si es es conectado o desconectado
	public static final String colConectividadEstado = "conectividadEstado";
	public static final String colConectividadFecha = "fecha";

	public DatabaseHelper(Context context) {
		super(context, nombreBD, null, VERSION_BD);
	}

	@Override
	public void onCreate(SQLiteDatabase db) {
		db.execSQL("CREATE TABLE " + contacto7AppTabla + " ("
				+ colContacto7appID + " INTEGER PRIMARY KEY , " + colUsuario
				+ " TEXT)");

		db.execSQL("CREATE TABLE " + mensajeTabla + " (" + colMensajeID
				+ " INTEGER PRIMARY KEY AUTOINCREMENT , " + colContactoExterno
				+ " TEXT NOT NULL, " + colContactoUsuario + " TEXT NOT NULL, "
				+ colTipoMensaje + " TEXT NOT NULL, " + colFecha + " INTEGER, "
				+ colContenido + " TEXT);");

		// Si nuestro usuario no tiene que estar en la Tabla 'contactos7app' de
		// la base de datos, se omite
		// db.execSQL("CREATE TRIGGER fk_contactoUsuario_contacto7appid "
		// + " BEFORE INSERT ON "
		// + mensajeTabla
		// + " FOR EACH ROW BEGIN"
		// + " SELECT CASE WHEN ((SELECT "
		// + colContacto7appID
		// + " FROM "
		// + contacto7AppTabla
		// + " WHERE "
		// + colUsuario
		// + "=new."
		// + colContactoUsuario
		// + " ) IS NULL) THEN RAISE (ABORT, 'Foreign Key Violation') END;"
		// + " END;");

		db.execSQL("CREATE TRIGGER fk_contactoExterno_contacto7appid "
				+ " BEFORE INSERT ON "
				+ mensajeTabla
				+ " FOR EACH ROW BEGIN"
				+ " SELECT CASE WHEN ((SELECT "
				+ colContacto7appID
				+ " FROM "
				+ contacto7AppTabla
				+ " WHERE "
				+ colUsuario
				+ "=new."
				+ colContactoExterno
				+ " ) IS NULL) THEN RAISE (ABORT, 'Foreign Key Violation') END;"
				+ " END;");

		db.execSQL("CREATE TABLE " + conectividadTabla + " ("
				+ colConectividadID + " INTEGER PRIMARY KEY AUTOINCREMENT , "
				+ colFecha + " INTEGER, " + colConectividadTipo + " INTEGER, "
				+ colConectividadEstado + " INTEGER )");
	}

	@Override
	public void onUpgrade(SQLiteDatabase db, int versionVieja, int versionNueva) {
		// TODO Auto-generated method stub
		db.execSQL("DROP TABLE IF EXISTS " + mensajeTabla);
		db.execSQL("DROP TABLE IF EXISTS " + contacto7AppTabla);
		db.execSQL("DROP TABLE IF EXISTS " + conectividadTabla);
		onCreate(db);
	}

	public long insertarMensaje(String nombreContactoExterno,
			String nombreContactoUsuario, long fecha, Integer tipoMensaje,
			String contenido) {

		SQLiteDatabase db = this.getWritableDatabase();
		ContentValues cv = new ContentValues();
		cv.put(colContactoExterno, nombreContactoExterno);
		cv.put(colContactoUsuario, nombreContactoUsuario);
		cv.put(colFecha, fecha);
		cv.put(colTipoMensaje, tipoMensaje);
		cv.put(colContenido, contenido);
		return db.insert(mensajeTabla, colMensajeID, cv);
	}

	public void insertarContacto7App(long id, String nombre) {
		SQLiteDatabase db = this.getWritableDatabase();
		try {
			ContentValues cv = new ContentValues();
			cv.put(colContacto7appID, id);
			cv.put(colUsuario, nombre);
			db.insert(contacto7AppTabla, colUsuario, cv);
		} catch (Exception ex) {
		} finally {
			db.close();
		}
	}

	public Cursor seleccionarContactoPorNombre(String nombre) {
		try {

			SQLiteDatabase db = this.getReadableDatabase();
			String query = "SELECT " + colContacto7appID + " as _id, "
					+ colUsuario + " FROM " + contacto7AppTabla + " WHERE "
					+ colUsuario + " =?";

			Cursor c = db.rawQuery(query, new String[] { nombre });
			return c;

		} catch (Exception ex) {

			return null;
		}
	}

	public Cursor seleccionarContactoPorId(Long idContacto2) {
		Cursor c = null;
		try {
			String idContacto = idContacto2.toString();
			SQLiteDatabase db = this.getReadableDatabase();
			String[] projection = new String[] { colContacto7appID, colUsuario };
			String selection = colContacto7appID + " = ?";
			String[] selectionArgs = new String[] { idContacto };
			String order = colContacto7appID + " ASC";
			c = db.query(contacto7AppTabla, projection, selection,
					selectionArgs, "", "", order);
		} catch (SQLiteException ex) {
			Log.e("PROBLEMA", ex.getMessage());
		}

		return c;

	}

	public Cursor seleccionarMensajePorNombreDestino(String nombre) {
		try {
			SQLiteDatabase db = this.getReadableDatabase();

			// primero obtengo el id del contacto a partir del nombre
			Integer idContacto = -1;
			Cursor cAux = seleccionarContactoPorNombre(nombre);
			if (cAux != null) {
				if (cAux.getCount() >= 1) {
					cAux.moveToFirst();
					idContacto = cAux.getInt(0);
				} else {
					// no existe un contacto con ese nombre
				}
			} else {
				// hubo un problema con la BD
			}

			// Busco el Cursor con los mensajer:
			String query = "SELECT " + colMensajeID + " as _id, "
					+ colContactoExterno + " , " + colContactoUsuario + " , "
					+ colFecha + " , " + colContenido + " WHERE "
					+ colContactoExterno + "=?";

			Cursor c = db.rawQuery(query,
					new String[] { idContacto.toString() });
			return c;

		} catch (Exception ex) {

			return null;
		}

	}

	public void insertarRegistroConectividad(Date fecha, int conectividadTipo,
			int conectividadEstado) {
		SQLiteDatabase db = this.getWritableDatabase();
		ContentValues cv = new ContentValues();
		cv.put(colFecha, fecha.getTime());
		cv.put(colConectividadTipo, conectividadTipo);
		cv.put(colConectividadEstado, conectividadEstado);
		db.insert(conectividadTabla, colConectividadID, cv);
		db.close();
	}

	public long seleccionarFechaUltimoMensajeRecibido() {
		Calendar calendar = Calendar.getInstance();
		calendar.set(1970, Calendar.JANUARY, 1, 0, 0, 0);
		long fecha = calendar.getTimeInMillis();
		SQLiteDatabase db = this.getReadableDatabase();
		String[] projection = { colMensajeID + " as _id", colFecha };
		Cursor cursor = db.query(mensajeTabla, projection, null, null, null,
				null, null);
		if (cursor.moveToFirst()) {
			fecha = cursor.getLong(1);
		}
		return fecha;
	}

	public Cursor seleccionarRegistrosDeConectividad(String selection,
			String[] selectionArgs, String order) {
		SQLiteDatabase db = this.getReadableDatabase();
		String[] projection = { colConectividadID + " as _id",
				colConectividadFecha, colConectividadTipo,
				colConectividadEstado };
		return db.query(conectividadTabla, projection, selection,
				selectionArgs, null, null, order);
	}

	public Cursor seleccionarMensajes(String selection, String[] selectionArgs,
			String order) {
		SQLiteDatabase db = this.getReadableDatabase();
		String[] projection = { colMensajeID + " as _id", colFecha,
				colContenido, colTipoMensaje, colContactoExterno,
				colContactoUsuario };
		return db.query(mensajeTabla, projection, selection, selectionArgs,
				null, null, order);
	}

	public void eliminarMensaje(long id) {
		SQLiteDatabase db = this.getWritableDatabase();
		db.delete(mensajeTabla, colMensajeID + " = ?",
				new String[] { String.valueOf(id) });
		db.close();
	}

	public void eliminarRegistroConectividad(long id) {
		SQLiteDatabase db = this.getWritableDatabase();
		db.delete(conectividadTabla, colConectividadID + " = ?",
				new String[] { String.valueOf(id) });
		db.close();
	}

	public Cursor seleccionarContactos() {
		Cursor c = null;
		try {
			SQLiteDatabase db = this.getReadableDatabase();
			String[] projection = new String[] { colContacto7appID, colUsuario };
			String order = colContacto7appID + " ASC";
			c = db.query(contacto7AppTabla, projection, null, null, null, null,
					order);
		} catch (SQLiteException ex) {
			Log.e("PROBLEMA", ex.getMessage());
		}

		return c;
	}
}
